package com.nxzh.de.executor.common.utils.http;

import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @author auto
 * @date 2019/05/25 0:58
 */
@Component("HttpClientUtil")
@Scope("prototype")
public class HttpClientUtil {
  private static Logger logger = LogManager.getLogger(HttpClientUtil.class);

  public static String doGet(String url) {
    CloseableHttpClient httpClient = null;
    CloseableHttpResponse response = null;
    String result = "";
    try {
      // 通过址默认配置创建一个httpClient实例
      httpClient = HttpClients.createDefault();
      // 创建httpGet远程连接实例
      HttpGet httpGet = new HttpGet(url);
      // 设置请求头信息，鉴权
      //httpGet.setHeader("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
      // 设置配置请求参数
      RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 连接主机服务超时时间
          .setConnectionRequestTimeout(35000)// 请求超时时间
          .setSocketTimeout(60000)// 数据读取超时时间
          .build();
      // 为httpGet实例设置配置
      httpGet.setConfig(requestConfig);
      // 执行get请求得到返回对象
      response = httpClient.execute(httpGet);
      // 通过返回对象获取返回数据
      int code = response.getStatusLine().getStatusCode();
      if ( code != 200) {
    	  logger.error(response);
      }
      HttpEntity entity = response.getEntity();
      // 通过EntityUtils中的toString方法将结果转换为字符串
      result = EntityUtils.toString(entity);
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      // 关闭资源
      if (null != response) {
        try {
          response.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      if (null != httpClient) {
        try {
          httpClient.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return result;
  }

  public static String doPost(String url, Object json) {
    CloseableHttpClient httpClient = null;
    CloseableHttpResponse httpResponse = null;
    String result = "";
    // 创建httpClient实例
    httpClient = HttpClients.createDefault();
    // 创建httpPost远程连接实例
    HttpPost httpPost = new HttpPost(url);
    // 配置请求参数实例
    RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 设置连接主机服务超时时间
        .setConnectionRequestTimeout(35000)// 设置连接请求超时时间
        .setSocketTimeout(60000)// 设置读取数据连接超时时间
        .build();
    // 为httpPost实例设置配置
    httpPost.setConfig(requestConfig);
    // 设置请求头
    httpPost.addHeader("Content-Type", "application/json");
//    httpPost.addHeader("Content-Length", "<calculated when request is sent>");
//    httpPost.addHeader("User-Agent", "PostmanRuntime/7.26.8");
//    httpPost.addHeader("Accept", "*/*");
//    httpPost.addHeader("Accept-Encoding", "gzip, deflate, br");
//    httpPost.addHeader("Connection", "keep-alive");

	// 为httpPost设置封装好的请求参数
	httpPost.setEntity(new StringEntity(json.toString(),"UTF-8"));

    try {
      // httpClient对象执行post请求,并返回响应参数对象
      httpResponse = httpClient.execute(httpPost);
      // 从响应对象中获取响应内容
      int code = httpResponse.getStatusLine().getStatusCode();
      if ( code != 200) {
    	  logger.error(httpResponse);
      }
      HttpEntity entity = httpResponse.getEntity();
      result = EntityUtils.toString(entity);
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      // 关闭资源
//      if (null != httpResponse) {
        try {
          httpResponse.close();
          httpClient.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
//      }
//      if (null != httpClient) {
//        try {
//          httpClient.close();
//        } catch (IOException e) {
//          e.printStackTrace();
//        }
//      }
    }
    return result;
  }
}
